﻿using Onshi.POS.Formularios.Properties;
using Onshi.POS.Formularios.Recursos;
using Onshi.POS.Modelo.Entidades;
using Onshi.POS.Modelo.Entidades.Tipos;
using Onshi.POS.Modelo.Enumeradores;
using Onshi.POS.Articulos;
using Onshi.POS.Articulos.Vistas;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Configuration;

namespace Onshi.POS.Formularios
{
    public partial class DescuentosRecargosFechasHoras : FormularioBase, IDescuentosRecargosFechasHoras
    {
        #region Constructores

        public DescuentosRecargosFechasHoras(Boolean esBusqueda)
        {
            CheckForIllegalCrossThreadCalls = false;
            InitializeComponent();
            btnSeleccionar.Visible = esBusqueda;
            presentador = new DescuentosRecargosFechasHorasPresentador(this);
            procesando = new Procesando();
        }

        #endregion

        #region Atributos

        private Boolean inicializando = true;
        private DescuentosRecargosFechasHorasPresentador presentador;
        private Int32 idDescuentoRecargoFechaHora;
        private enum MetodoHilo { Inicializar, Actualizar, Aceptar, Eliminar };

        #endregion

        #region Propiedades

        public Int32 IdDescuentoRecargoFechaHoraSeleccionado
        {
            get { return idDescuentoRecargoFechaHora; }
        }

        [Browsable(false)]
        public Boolean Lunes
        {
            get { return chkLunes.Checked; }
        }

        [Browsable(false)]
        public Boolean Martes
        {
            get { return chkMartes.Checked; }
        }

        [Browsable(false)]
        public Boolean Miercoles
        {
            get { return chkMiercoles.Checked; }
        }

        [Browsable(false)]
        public Boolean Jueves
        {
            get { return chkJueves.Checked; }
        }

        [Browsable(false)]
        public Boolean Viernes
        {
            get { return chkViernes.Checked; }
        }

        [Browsable(false)]
        public Boolean Sabado
        {
            get { return chkSabado.Checked; }
        }

        [Browsable(false)]
        public Boolean Domingo
        {
            get { return chkDomingo.Checked; }
        }

        [Browsable(false)]
        public DateTime FechaDesde
        {
            get { return fecFechaDesde.Value; }
        }

        [Browsable(false)]
        public DateTime FechaHasta
        {
            get { return fecFechaHasta.Value; }
        }

        [Browsable(false)]
        public Decimal DescuentoRecargo
        {
            get { return numDescuentoRecargo.Value; }
        }

        [Browsable(false)]
        public TimeSpan HoraDesde
        {
            get { return new TimeSpan(tieHoraDesde.Value.Hour, tieHoraDesde.Value.Minute, tieHoraDesde.Value.Second); }
        }

        [Browsable(false)]
        public TimeSpan HoraHasta
        {
            get { return new TimeSpan(tieHoraHasta.Value.Hour, tieHoraHasta.Value.Minute, tieHoraHasta.Value.Second); }
        }

        [Browsable(false)]
        public Decimal DescuentoRecargoDesdeFiltro
        {
            get { return ucDescuentoRecargoFiltro.Desde; }
        }

        [Browsable(false)]
        public Decimal DescuentoRecargoHastaFiltro
        {
            get { return ucDescuentoRecargoFiltro.Hasta; }
        }

        [Browsable(false)]
        public Int32 IdUsuarioSistema
        {
            get { return Principal.IdUsuarioSistema; }
        }

        [Browsable(false)]
        public Int32 IdDescuentoRecargoFechaHora
        {
            get { return idDescuentoRecargoFechaHora; }
        }

        [Browsable(false)]
        public String Nombre
        {
            get { return txtNombre.Text; }
        }

        [Browsable(false)]
        public String NombreFiltro
        {
            get { return txtNombreFiltro.Text; }
        }

        [Browsable(false)]
        public String Observaciones
        {
            get { return txtObservaciones.Text; }
        }

        [Browsable(false)]
        public List<DescuentoRecargoFechaHora> ListadoDescuentosRecargosFechasHoras
        {
            set { bsDescuentosRecargosFechasHoras.DataSource = new SortableList<DescuentoRecargoFechaHora>(value); }
        }

        [Browsable(false)]
        public EnumSiNo ObservacionesFiltro
        {
            get { return (EnumSiNo)((Byte)cboObservacionesFiltro.SelectedValue); }
        }

        #endregion

        #region Metodos

        private void ActualizarCampos()
        {
            if (bsDescuentosRecargosFechasHoras.Current != null)
            {
                idDescuentoRecargoFechaHora = ((DescuentoRecargoFechaHora)bsDescuentosRecargosFechasHoras.Current).Id;
                txtNombre.Text = ((DescuentoRecargoFechaHora)bsDescuentosRecargosFechasHoras.Current).Nombre;
                txtObservaciones.Text = ((DescuentoRecargoFechaHora)bsDescuentosRecargosFechasHoras.Current).Observaciones;
                chkLunes.Checked = ((DescuentoRecargoFechaHora)bsDescuentosRecargosFechasHoras.Current).Lunes;
                chkMartes.Checked = ((DescuentoRecargoFechaHora)bsDescuentosRecargosFechasHoras.Current).Martes;
                chkMiercoles.Checked = ((DescuentoRecargoFechaHora)bsDescuentosRecargosFechasHoras.Current).Miercoles;
                chkJueves.Checked = ((DescuentoRecargoFechaHora)bsDescuentosRecargosFechasHoras.Current).Jueves;
                chkViernes.Checked = ((DescuentoRecargoFechaHora)bsDescuentosRecargosFechasHoras.Current).Viernes;
                chkSabado.Checked = ((DescuentoRecargoFechaHora)bsDescuentosRecargosFechasHoras.Current).Sabado;
                chkDomingo.Checked = ((DescuentoRecargoFechaHora)bsDescuentosRecargosFechasHoras.Current).Domingo;
                numDescuentoRecargo.Value = ((DescuentoRecargoFechaHora)bsDescuentosRecargosFechasHoras.Current).DescuentoRecargo;
                fecFechaDesde.Value = ((DescuentoRecargoFechaHora)bsDescuentosRecargosFechasHoras.Current).FechaDesde;
                fecFechaHasta.Value = ((DescuentoRecargoFechaHora)bsDescuentosRecargosFechasHoras.Current).FechaHasta;
                tieHoraDesde.Value = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, ((DescuentoRecargoFechaHora)bsDescuentosRecargosFechasHoras.Current).HoraDesde.Hours, ((DescuentoRecargoFechaHora)bsDescuentosRecargosFechasHoras.Current).HoraDesde.Minutes, ((DescuentoRecargoFechaHora)bsDescuentosRecargosFechasHoras.Current).HoraDesde.Seconds);
                tieHoraHasta.Value = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, ((DescuentoRecargoFechaHora)bsDescuentosRecargosFechasHoras.Current).HoraHasta.Hours, ((DescuentoRecargoFechaHora)bsDescuentosRecargosFechasHoras.Current).HoraHasta.Minutes, ((DescuentoRecargoFechaHora)bsDescuentosRecargosFechasHoras.Current).HoraHasta.Seconds);
            }
            else
                LimpiarCampos();
        }

        private void LimpiarFiltro()
        {
            inicializando = true;
            txtNombreFiltro.Text = String.Empty;
            cboObservacionesFiltro.SelectedValue = (Byte)EnumSiNo.Todos;
            ucDescuentoRecargoFiltro.LimpiarCampos();
            inicializando = false;
        }

        private void LimpiarCampos()
        {
            errDescuentosRecargosFechasHoras.Clear();
            idDescuentoRecargoFechaHora = 0;
            txtNombre.Text = String.Empty;
            txtObservaciones.Text = String.Empty;
            chkLunes.Checked = false;
            chkMartes.Checked = false;
            chkMiercoles.Checked = false;
            chkJueves.Checked = false;
            chkViernes.Checked = false;
            chkSabado.Checked = false;
            chkDomingo.Checked = false;
            numDescuentoRecargo.Value = 0;
            fecFechaDesde.Value = DateTime.Now;
            fecFechaHasta.Value = DateTime.Now;
            tieHoraDesde.Value = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 0, 0);
            tieHoraHasta.Value = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 23, 59, 59);
        }

        private void HabilitarControles(Boolean habilitar)
        {
            txtNombre.Enabled = habilitar;
            txtObservaciones.Enabled = habilitar;
            chkLunes.Enabled = habilitar;
            chkMartes.Enabled = habilitar;
            chkMiercoles.Enabled = habilitar;
            chkJueves.Enabled = habilitar;
            chkViernes.Enabled = habilitar;
            chkSabado.Enabled = habilitar;
            chkDomingo.Enabled = habilitar;
            numDescuentoRecargo.Enabled = habilitar;
            fecFechaDesde.Enabled = habilitar;
            fecFechaHasta.Enabled = habilitar;
            tieHoraDesde.Enabled = habilitar;
            tieHoraHasta.Enabled = habilitar;
            btnNuevo.Enabled = !habilitar;
            btnModificar.Enabled = !habilitar;
            btnEliminar.Enabled = !habilitar;
            btnAceptar.Enabled = habilitar;
            btnCancelar.Enabled = habilitar;
            navDescuentosRecargosFechasHoras.Enabled = !habilitar;
            if (!habilitar)
                ValidarControles();
        }

        private void ValidarControles()
        {
            if (bsDescuentosRecargosFechasHoras.Current != null)
            {
                btnSeleccionar.Enabled = true;
                if (((DescuentoRecargoFechaHora)bsDescuentosRecargosFechasHoras.Current).Id == (Int32)EnumDescuentosRecargosFechasHoras.SinDescuentoNiRecargo)
                {
                    btnModificar.Enabled = false;
                    btnEliminar.Enabled = false;
                }
                else
                {
                    btnModificar.Enabled = true;
                    btnEliminar.Enabled = true;
                }
            }
            else
            {
                idDescuentoRecargoFechaHora = 0;
                btnSeleccionar.Enabled = false;
                btnModificar.Enabled = false;
                btnEliminar.Enabled = false;
            }
        }

        private void Filtrar()
        {
            if (!inicializando)
                presentador.Filtrar();
        }

        #endregion

        #region Eventos

        #region Filtro

        private void txtNombreFiltro_TextChanged(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void cboObservacionesFiltro_SelectionChangeCommitted(Object sender, EventArgs e)
        {
            Filtrar();
        }

        private void ucDescuentoRecargoFiltro_CambioValor()
        {
            Filtrar();
        }

        #endregion

        private void DescuentosRecargosFechasHoras_Load(Object sender, EventArgs e)
        {
            solDescuentosRecargosFechasHoras.SelectedTab = tabDetalle;
            solDescuentosRecargosFechasHoras.SelectedTab = tabListado;
            grdDescuentosRecargosFechasHoras.ScrollBars = ScrollBars.None;
            bgwDescuentosRecargosFechasHoras.RunWorkerAsync(MetodoHilo.Inicializar);
            procesando.ShowDialog();
        }

        private void btnNuevo_Click(Object sender, EventArgs e)
        {
            LimpiarCampos();
            HabilitarControles(true);
            txtNombre.Focus();
        }

        private void btnModificar_Click(Object sender, EventArgs e)
        {
            HabilitarControles(true);
            txtNombre.Focus();
        }

        private void btnEliminar_Click(Object sender, EventArgs e)
        {
            if (MessageBox.Show("Los artículos que posean este descuento y recargo por fecha y hora se actualizarán con el predeterminado" + Environment.NewLine + "¿Está seguro que desea eliminar el descuento y recargo por fecha y hora?", ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
            {
                bgwDescuentosRecargosFechasHoras.RunWorkerAsync(MetodoHilo.Eliminar);
                procesando.ShowDialog();
            }
        }

        private void btnAceptar_Click(Object sender, EventArgs e)
        {
            var validado = true;
            errDescuentosRecargosFechasHoras.Clear();
            if (String.IsNullOrWhiteSpace(txtNombre.Text))
            {
                validado = false;
                errDescuentosRecargosFechasHoras.SetError(txtNombre, "El nombre no puede quedar vacío");
            }
            if (fecFechaDesde.Value > fecFechaHasta.Value)
            {
                validado = false;
                errDescuentosRecargosFechasHoras.SetError(fecFechaHasta, "La fecha desde no puede ser mayor a la fecha hasta");
            }
            if (new TimeSpan(tieHoraDesde.Value.Hour, tieHoraDesde.Value.Minute, tieHoraDesde.Value.Second) > new TimeSpan(tieHoraHasta.Value.Hour, tieHoraHasta.Value.Minute, tieHoraHasta.Value.Second))
            {
                validado = false;
                errDescuentosRecargosFechasHoras.SetError(tieHoraHasta, "La hora desde no puede ser mayor a la hora hasta");
            }
            if (validado)
            {
                bgwDescuentosRecargosFechasHoras.RunWorkerAsync(MetodoHilo.Aceptar);
                procesando.ShowDialog();
            }
        }

        private void btnCancelar_Click(Object sender, EventArgs e)
        {
            LimpiarCampos();
            HabilitarControles(false);
            ActualizarCampos();
        }

        private void btnActualizar_Click(Object sender, EventArgs e)
        {
            bgwDescuentosRecargosFechasHoras.RunWorkerAsync(MetodoHilo.Actualizar);
            procesando.ShowDialog();
        }

        private void btnSeleccionar_Click(Object sender, EventArgs e)
        {
            idDescuentoRecargoFechaHora = ((DescuentoRecargoFechaHora)bsDescuentosRecargosFechasHoras.Current).Id;
            DialogResult = DialogResult.OK;
        }

        private void btnSalir_Click(Object sender, EventArgs e)
        {
            Close();
        }

        private void btnLimpiar_Click(Object sender, EventArgs e)
        {
            LimpiarFiltro();
            presentador.Filtrar();
        }

        private void solDescuentosRecargosFechasHoras_Selecting(Object sender, TabControlCancelEventArgs e)
        {
            if (solDescuentosRecargosFechasHoras.SelectedTab == tabDetalle)
                ActualizarCampos();
            else
                if (!navDescuentosRecargosFechasHoras.Enabled)
                    e.Cancel = true;
        }

        private void grdDescuentosRecargosFechasHoras_CellFormatting(Object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (bsDescuentosRecargosFechasHoras.Count > 0 && bsDescuentosRecargosFechasHoras.Count == grdDescuentosRecargosFechasHoras.RowCount)
            {
                if (grdDescuentosRecargosFechasHoras.Columns[e.ColumnIndex].Index == colObservaciones.Index)
                    if (((DescuentoRecargoFechaHora)bsDescuentosRecargosFechasHoras.List[e.RowIndex]).Observaciones != String.Empty)
                        e.Value = Properties.Resources.page_copy;
            }
        }

        private void grdDescuentosRecargosFechasHoras_CellClick(Object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1)
                if (bsDescuentosRecargosFechasHoras.Current != null && e.ColumnIndex == colDetalle.Index)
                {
                    var descuentosRecargosFechasHorasDetalle = new DescuentosRecargosFechasHorasDetalle(((DescuentoRecargoFechaHora)bsDescuentosRecargosFechasHoras.Current).Id);
                    descuentosRecargosFechasHorasDetalle.ShowDialog();
                }
        }

        private void bgwDescuentosRecargosFechasHoras_DoWork(Object sender, DoWorkEventArgs e)
        {
            try
            {
                switch ((MetodoHilo)e.Argument)
                {
                    case MetodoHilo.Inicializar:
                        presentador.Inicializar();
                        cboObservacionesFiltro.Actualizar();
                        ucDescuentoRecargoFiltro.Actualizar();
                        break;
                    case MetodoHilo.Actualizar:
                        presentador.Actualizar();
                        break;
                    case MetodoHilo.Aceptar:
                        presentador.Aceptar();
                        LimpiarCampos();
                        HabilitarControles(false);
                        ActualizarCampos();
                        solDescuentosRecargosFechasHoras.SelectedTab = tabListado;
                        break;
                    case MetodoHilo.Eliminar:
                        presentador.Eliminar();
                        solDescuentosRecargosFechasHoras.SelectedTab = tabListado;
                        break;
                }
            }
            catch (Exception ex)
            {
                throw new InvalidOperationException(ex.Message);
            }
        }

        private void bgwDescuentosRecargosFechasHoras_RunWorkerCompleted(Object sender, RunWorkerCompletedEventArgs e)
        {
            inicializando = false;
            procesando.Close();
            if (e.Error != null)
                MessageBox.Show(e.Error.Message, ConfigurationManager.AppSettings["NombreAplicacion"], MessageBoxButtons.OK, MessageBoxIcon.Information);
            else
                actDescuentosRecargosFechasHoras.Actualizar();
            grdDescuentosRecargosFechasHoras.ScrollBars = ScrollBars.Both;
        }

        private void bsDescuentosRecargosFechasHoras_PositionChanged(Object sender, EventArgs e)
        {
            if (solDescuentosRecargosFechasHoras.SelectedTab == tabDetalle)
                ActualizarCampos();
        }

        private void grdDescuentosRecargosFechasHoras_SelectionChanged(Object sender, EventArgs e)
        {
            ValidarControles();
        }

        #endregion
    }
}